home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / haeberli / objtools / avgnorm.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  3KB  |  99 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /* 
  18.  *    avgnorm -
  19.  *        Average the normals of each polygon.  This 
  20.  *    will give the object a faceted appearence.
  21.  *
  22.  *            Paul Haeberli - 1990
  23.  */
  24. #include "math.h"
  25. #include "stdio.h"
  26. #include "vect.h"
  27. #include "sgiobj.h"
  28.  
  29. main(argc,argv)
  30. int argc;
  31. char **argv;
  32. {
  33.     sgiobj *obj;
  34.  
  35.     if(argc<3) {
  36.     fprintf(stderr,"avgnorm: in.sgo out.sgo\n");
  37.     exit(1);
  38.     }
  39.     obj = readsgiobj(argv[1]);
  40.     avgnorm(obj);
  41.     writesgiobj(argv[2],obj);
  42.     exit(0);
  43. }
  44.  
  45. avgnorm(obj)
  46. sgiobj *obj;
  47. {
  48.     long npolys;
  49.     long *data;
  50.     char *vertdata, *avert;
  51.     int nverts;
  52.     vect n;
  53.  
  54.     data = obj->data;
  55.     if(obj->objtype == OBJ_QUADLIST) {
  56.     npolys = (obj->nlongs/PNTLONGS)/4;
  57.     while(npolys--) {
  58.         vzero(&n);
  59.         vadd(data+(PNTLONGS*0)+OFFSET_NORMAL,&n,&n);
  60.         vadd(data+(PNTLONGS*1)+OFFSET_NORMAL,&n,&n);
  61.         vadd(data+(PNTLONGS*2)+OFFSET_NORMAL,&n,&n);
  62.         vadd(data+(PNTLONGS*3)+OFFSET_NORMAL,&n,&n);
  63.         vnormal(&n);
  64.         setnorm(&n,data+(PNTLONGS*0)+OFFSET_NORMAL);
  65.         setnorm(&n,data+(PNTLONGS*1)+OFFSET_NORMAL);
  66.         setnorm(&n,data+(PNTLONGS*2)+OFFSET_NORMAL);
  67.         setnorm(&n,data+(PNTLONGS*3)+OFFSET_NORMAL);
  68.         data += PNTLONGS*4;
  69.     }
  70.     } else if(obj->objtype == OBJ_TRILIST) {
  71.     npolys = (obj->nlongs/PNTLONGS)/3;
  72.     while(npolys--) {
  73.         vzero(&n);
  74.         vadd(data+(PNTLONGS*0)+OFFSET_NORMAL,&n,&n);
  75.         vadd(data+(PNTLONGS*1)+OFFSET_NORMAL,&n,&n);
  76.         vadd(data+(PNTLONGS*2)+OFFSET_NORMAL,&n,&n);
  77.         vnormal(&n);
  78.         setnorm(&n,data+(PNTLONGS*0)+OFFSET_NORMAL);
  79.         setnorm(&n,data+(PNTLONGS*1)+OFFSET_NORMAL);
  80.         setnorm(&n,data+(PNTLONGS*2)+OFFSET_NORMAL);
  81.         data += PNTLONGS*3;
  82.     }
  83.     } else if(obj->objtype == OBJ_TRIMESH) {
  84.     fprintf(stderr,"avgnorm: can't do tmeshes yet\n");
  85.     exit(1);
  86.     } else {
  87.     fprintf(stderr,"avgnorm: bad object type %d\n",obj->objtype);
  88.     exit(1);
  89.     }
  90. }
  91.  
  92. setnorm(s,d)
  93. float *s, *d;
  94. {
  95.     d[0] = s[0];
  96.     d[1] = s[1];
  97.     d[2] = s[2];
  98. }
  99.